package tg.game.lottery.crawler;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;

import com.alibaba.druid.util.StringUtils;

/**
 * 开奖缓存
 * @author NKW
 * 抓到的奖先缓存在这里，如果是新的或有变化，就插入或更新到数据库，如果已经存在就不需要了
 * 
 * 
 * 
 */
public class LotteryCache {
	public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private Map<String, GameLottery> cache = new HashMap<String,GameLottery>();
	private Dao dao;
	public LotteryCache(Dao dao) {
		this.dao = dao;
	}
	/**
	 * 
	 * @param lotteryContent  抓到的内容
	 * @param bindId          绑定在哪一列上
	 * @throws ParseException 
	 * 一定要同步，防止多个网址同时进来缓存，造成多条记录同时插入
	 */
	public synchronized void cache(Map<String, String> lotteryContent,int bindId) throws ParseException {
		String gid = lotteryContent.get(LotteryParser.KEY_GID);
		String round_id = lotteryContent.get(LotteryParser.KEY_ROUND_ID);
		String lottery = lotteryContent.get(LotteryParser.KEY_LOTTERY_CONTENT);
		Timestamp open_time = new Timestamp(format.parse(lotteryContent.get(LotteryParser.KEY_OPEN_TIME)).getTime());
				
		GameLottery cacheLottery = cache.get(gid);//先取本游戏的缓存（不加场次的）
		if (cacheLottery == null){//如果缓存没有，再判断数据库有没有(数据库要加场次)
			GameLottery  dbLottery = dao.fetch(GameLottery.class, Cnd.where("gid", "=", gid).and("round_id", "=", round_id));
			if (dbLottery == null){
			    //说明数据库也没有，那得插入数据库了
				dbLottery = createLottery(lotteryContent, bindId);
				dao.insert(dbLottery);
				System.err.println("数据库还没有开出来过，所以直接插入数据库后，再扔给内存缓存，等会拿来对比。。。"+bindId);
			}else{
				System.err.println("数据库已经开出来过了，所以直接缓存到内存，等会拿来对比。。。");
			}
			cacheLottery = dbLottery;//数据库的缓存赋给内存缓存，拿来对比
			this.cache.put(gid, cacheLottery);//最后直接放入缓存
		}
		if (round_id.equals(cacheLottery.getRound_id())){//如果是同一期的
			//判断有没有开过奖了
			if (StringUtils.isEmpty(cacheLottery.getLottery(bindId))){
				//说明本字段没有开过奖，更新就好
				cacheLottery.setLottery(lottery, bindId);
				cacheLottery.setOpen_time(open_time, bindId);
				cacheLottery.setRecord_time(new Timestamp(System.currentTimeMillis()), bindId);
				dao.update(cacheLottery);//更新
				System.err.println("新列开奖出来了，更新记录。。。"+bindId);
			}
			return;//如果是新游戏直接返回
		}else{
			if (round_id.compareTo(cacheLottery.getRound_id()) < 0){
				System.err.println("这是旧期，不是最新的开奖数据，直接跳过去了XXXXXX");
				return;//如果当前期数是小于缓存的期数，说明是早开的，就不处理了
			}else{
				//是新期的开奖
				cacheLottery = createLottery(lotteryContent, bindId);//直接创建一个新的赋给缓存
				dao.insert(cacheLottery);//插入数据库
				System.err.println("新期开出来了:"+bindId);
				this.cache.put(gid, cacheLottery);//新期开奖最后更新到缓存
			}
		}
	}
	private GameLottery createLottery(Map<String, String> lotteryContent,int bindId) throws ParseException{
		GameLottery ret = new GameLottery();
		ret.setGid(lotteryContent.get(LotteryParser.KEY_GID));
		ret.setRound_id(lotteryContent.get(LotteryParser.KEY_ROUND_ID));
		ret.setLottery(lotteryContent.get(LotteryParser.KEY_LOTTERY_CONTENT),bindId);
		ret.setOpen_time(new Timestamp(format.parse(lotteryContent.get(LotteryParser.KEY_OPEN_TIME)).getTime()), bindId);
		ret.setRecord_time(new Timestamp(System.currentTimeMillis()), bindId);
		ret.setCreate_time(new Timestamp(System.currentTimeMillis()));
		return ret;
	}
	
	
}
